/*
敌兵布阵

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 6   Accepted Submission(s) : 1

Problem Description
C国的死对头A国这段时间正在进行军事演习，所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,
Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段，所以每个工兵营地的人数C国都掌握的一清二楚,
每个工兵营地的人数都有可能发生变动，可能增加或减少若干人手,但这些都逃不过C国的监视。
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,
例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。
但敌兵营地的人数经常变动，而Derek每次询问的段都不一样，所以Tidy不得不每次都一个一个营地的去数，很快就精疲力尽了，
Derek对Tidy的计算速度越来越不满:"你个死肥仔，算得这么慢，我炒你鱿鱼!”Tidy想：“你自己来算算看，
如果你的程序效率不够高的话，Tidy还是会受到Derek的责骂的.
Input
第一行一个整数T，表示有T组数据。
每组数据第一行一个正整数N（N<=50000）,表示敌人有N个工兵营地，接下来有N个正整数,
第i个正整数ai代表第i个工兵营地里开始时有ai个人（1<=ai<=50）。
接下来每行有一条命令，命令有4种形式：
(1) Add i j,i和j为正整数,表示第i个营地增加j个人（j不超过30）
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人（j不超过30）;
(3)Query i j ,i和j为正整数,i<=j，表示询问第i到第j个营地的总人数;
(4)End 表示结束，这条命令在每组数据最后出现;
每组数据最多有40000条命令
Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问，输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
Sample Input
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End 
Sample Output
Case 1:
6
33
59
 */
package com.yuan.algorithms.team20150724;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月6日 上午10:04:00
 * @Explain 说明:
 */
public class 线段树_敌兵布阵 {

	static int MAXN = 50001;
	static int[] sum = new int[MAXN << 2];
	//创建缓冲输入流和输入流，加速输入输出
	static StreamTokenizer in = new StreamTokenizer(new BufferedReader(
			new InputStreamReader(System.in)));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

	public static int nextInt() throws IOException {
		in.nextToken();
		return (int) in.nval;
	}

	public static String next() throws IOException {
		in.nextToken();
		return in.sval;
	}

	public static void main(String[] args) throws IOException {
		int t = nextInt();
		for (int i = 1; i <= t; i++) {
			int n = nextInt();
			buildTree(1, n, 1);
			out.println("Case " + i + ":");
			while (true) {
				String order = next();
				if (order.equals("End")) {
					break;
				}
				int a = nextInt();
				int b = nextInt();
				switch (order) {
				case "Add":
					add(a, b, 1, n, 1);
					break;
				case "Sub":
					sub(a, b, 1, n, 1);
					break;
				case "Query":
					out.println(query(a, b, 1, n, 1));
					break;
				}
			}
		}
		out.flush();//刷新该流的缓冲(将缓冲区的数据输出)
	}

	/**
	 * 在营地添加人数
	 * 
	 * @param i
	 *            营地编号
	 * @param newValue
	 *            添加的人数
	 * @param left
	 *            左区间
	 * @param right
	 *            右区间
	 * @param index
	 *            当前线段树下标
	 */
	private static void add(int i, int newValue, int left, int right, int index) {
		if (left == right) {
			sum[index] += newValue;
			return;
		}
		int mid = (left + right) >> 1;
		if (i <= mid) {
			add(i, newValue, left, mid, index << 1);
		} else {
			add(i, newValue, mid + 1, right, index << 1 | 1);
		}
		sum[index] = sum[index << 1] + sum[index << 1 | 1];
	}

	/**
	 * 在营地减少人数
	 * 
	 * @param i
	 * @param newValue
	 * @param left
	 * @param right
	 * @param index
	 */
	private static void sub(int i, int newValue, int left, int right, int index) {
		add(i, -newValue, left, right, index);
	}

	/**
	 * 查询两个营地之间的总人数
	 * 
	 * @param a
	 * @param b
	 * @param left
	 * @param right
	 * @param index
	 * @return
	 */
	private static int query(int a, int b, int left, int right, int index) {
		if (a <= left && b >= right) {
			return sum[index];
		}
		int mid = (left + right) >> 1;
		int Sum = 0;
		if (a <= mid) {
			Sum = query(a, b, left, mid, index << 1);
		}
		if (b > mid) {
			Sum += query(a, b, mid + 1, right, index << 1 | 1);
		}
		return Sum;
	}

	private static void buildTree(int left, int right, int index)
			throws IOException {
		if (left == right) {
			sum[index] = nextInt();
			return;
		}
		int mid = (left + right) >> 1;
		buildTree(left, mid, index << 1);
		buildTree(mid + 1, right, index << 1 | 1);
		sum[index] = sum[index << 1] + sum[index << 1 | 1];
	}

}
